import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Clase Heroe que representa al usuario en el juego.
 * 
 * @author (Gerardo Antonio Hernandez & Christian Israel Rodriguez) 
 * @version (25/06/2013)
 */
public class Heroe extends Actor
{
    private GreenfootImage imagenDer[]= new GreenfootImage [11];
    private GreenfootImage imagenIzq[]= new GreenfootImage [11];

    private GreenfootImage saltaDer[]= new GreenfootImage [6];
    private GreenfootImage saltaIzq[]= new GreenfootImage [6];
    
    private GreenfootImage DisparoDer[]= new GreenfootImage [8];
    private GreenfootImage DisparoIzq[]= new GreenfootImage [8];
    
    private GreenfootImage gameOver= new GreenfootImage("GameOver.png");
    

    private int numIma;
    private int dir;
   private boolean disparo;
    private boolean bandDer;
    private boolean bandIzq;
    private boolean salto;
    private boolean caer;
    
    private int numEsp;
    private static final int maxEsp=2;
    //////////////////////////////////////////////
    private int VIDAS;
    private int SCORE;
    
    private Counter score;
    private Counter vidas;
    /////////////////////////////////////////////////

    /**
     * Constructor que inizializa las variables bandera y el indice del arreglo de imagenes
     */
    public Heroe()
    {
        
        this(0);
        
        
    }
    
    /**
     * Constructor de heroe que pasa como parametro un score
     */
    public Heroe(int unScore)
    {
        Nivel1 mundo= (Nivel1)getWorld();
        
        dir=0;  // 0 nula ... 1 derecha ... 2 izquierda ////////////
        numIma=0;
        bandDer=false;
        bandIzq=false;
        salto=false;
        caer=false;
        //suelo=0;
        this.CargarArregloIma();
        numEsp=0;
        VIDAS=3;
        SCORE=unScore;
        
        
        
         
        
    }
        

    /**
     * Este metodo carga en el arreglo las imagenes utilizadas.
     */
    public void CargarArregloIma()
    {
        for(int i=0; i<8; i++)
        {
        DisparoDer[i]= (new GreenfootImage("DisparoDer"+(i)+".png"));
        DisparoIzq[i]= (new GreenfootImage("DisparoIzq"+(i)+".png"));
        }
        
        for(int i=0;i<11;i++)
            imagenDer[i]=(new GreenfootImage("mueveDer"+(i)+".png"));

        for(int i=0;i<11;i++)
            imagenIzq[i]=(new GreenfootImage("mueveIzq"+(i)+".png"));

        for(int i=0;i<6;i++)
        {
            saltaDer[i]= (new GreenfootImage("saltoDer"+(i)+".png"));
            saltaIzq[i]= (new GreenfootImage("saltoIzq"+(i)+".png"));
        }

    }

    public void act()
    {
        
        Nivel1 mundo= (Nivel1)getWorld();
        numEsp= (numEsp+1)%maxEsp;
        if(numEsp!=0)
        return;
         
       
        
        this.mueve();
        this.pisaBase();
        
        caer=false;
        salto=false;
        
        
         if (VIDAS ==0)             //Si se terminan las vidas...
        {
           
            
              mundo.eliminaObjetos();
              mundo.detenlvl1();
              mundo.detenlvl2();
              mundo.detenlvl3();
              mundo.actualicemosPuntos();
              GreenfootSound fin=new GreenfootSound("game over.mp3");
               mundo.setBackground("GameOver.png");
               fin.play();
              Greenfoot.delay(400);
              fin.stop();
              mundo.prepare(0);
              
              mundo.reseteaNivel();
              VIDAS=3;
              SCORE=0;
              
        }
    }

    /**
     * Este metodo ejecuta el movimiento del Heroe dependiendo de la tecla presionada
     */
    public void mueve()
    {
        World mundo = getWorld();
        GreenfootImage imagen = getImage();

        if(Greenfoot.isKeyDown("right"))
        {
            if (this.getX()< mundo.getWidth())
            {
                numIma = (numIma + 1) % 11;
                setImage( imagenDer[numIma] );
                move(7);
                bandDer=true;
                dir=1;
            }

        }
        if(Greenfoot.isKeyDown("left"))
        {

            if (this.getX()< mundo.getWidth())
            {
                numIma = (numIma + 1) % 11;
                setImage( imagenIzq[numIma] );
                move(-7);
                bandIzq=true;
                dir=2;
            }

        }
        
        if(Greenfoot.isKeyDown("s"))
        {
        DisparaBala();
        disparo=true;
        }
        

        if(Greenfoot.isKeyDown("up")&& baseArriba()==false )
        {
            salto=true;
            caer=false;
            //SALTARA HACIA LA DERECHA DIR ==1 
            if (this.getX()< mundo.getWidth()&& this.getY()<mundo.getHeight()&& dir==1&&salto&& !pisaBase())
            {
                numIma = (numIma + 1) % 6;
                setImage( saltaDer[numIma] );
                
                super.setLocation(super.getX()+20,super.getY()-70);
                salto=true;
                //caer=true;
                
                
                
            }
            //SALTARA HACIA LA IZQUIERDA DIR == 1
            if (this.getX()< mundo.getWidth()&& this.getY()<mundo.getHeight()&& dir==2&&salto&& !pisaBase())
            {
                numIma = (numIma + 1) % 6;
                setImage( saltaIzq[numIma] );
                super.setLocation(super.getX()-20,super.getY()-70);
                salto=true;
                //caer=true;

            }

        }
       
        if(!Greenfoot.isKeyDown("right") && bandDer==true)
        {
            setImage( imagenDer[0] );
            bandDer=false;
        }
        if(!Greenfoot.isKeyDown("left") && bandIzq==true)
        {
            setImage( imagenIzq[0] );
            bandIzq=false;
        }
        
        if(!Greenfoot.isKeyDown("up") && salto==true && dir==1 )
        {
            setImage( saltaDer[5] );
            salto=false;
        }
        if(!Greenfoot.isKeyDown("up") && salto==true && dir==2)
        {
            setImage( saltaIzq[5] );
            salto=false;
        }

    }
    
    /**
     * Cambia la bandera si el heroe esta callendo
     */

    public void cambiaBanderaCaer(boolean value)
    {
       
        caer=value;
        
    }
    
    /**
     * Regresa si esta callendo o no
     */
    public boolean getCaer()
    {
        return caer;
    }
    /**
     * 
     * Metodo que evalua si esta sobre alguna base solida que evite su caida
     */
    public boolean pisaBase()
    {
        Actor a= super.getOneObjectAtOffset(0,20,BaseSolida.class);
        
        if(a==null)
            gravedad();
        else
        return(false);
        
        return true;
    }
    /**
     * Metodo que simula la gravedad.
     */
    public void gravedad()
    {
        
        if(dir==1)
        {
        setLocation(getX()+1,getY()+5); 
        setImage(saltaDer[3]);
        }
        if(dir==2)
        {
         setLocation(getX()-1,getY()+5); 
         setImage(saltaIzq[3]);
        }
        
    } 
    
    /**
     * Revisa si esta en una base
     */
    
    public boolean baseArriba()
    {
         Actor a= super.getOneObjectAtOffset(0,-35,BaseSolida.class);
        
        if(a==null)
         return false; 
        else
        return true;
    }
    
    /**
     * Metodo que permite crear una bala al presionar la tecla "s"
     */
    public void DisparaBala()
    {
        World mundo = getWorld();
        Greenfoot.playSound("EnergyGun.wav");
        if(dir==1)
        {
            for(int i=0;i<8;i++)
            {
             numIma = (numIma + 1) % 8;
             Greenfoot.delay(1);
             setImage( DisparoDer[numIma] );
            }
            setImage(imagenDer[0] );
        }
            
        else
        {
            for(int i=0;i<8;i++)
            {
             numIma = (numIma + 1) % 8;
             Greenfoot.delay(1);
             setImage( DisparoIzq[numIma] );
            }
             setImage(imagenIzq[0]);
        }
        
        Bala bala =new Bala(getX()+5,getY()+10,dir);
        mundo.addObject(bala, getX(), getY());
    }
    
    /**
     * Si el Heroe es atacado regresa a la posicion inicial del juego
     */
    public void goHome()
    {
        setLocation(18, 458);
    }
    
    /**
     * si el heroe esta en una caja de salto
     */
    public void SuperJump()
    {
        setLocation(this.getX(),this.getY()-100);
    }
    
    /**
     * Disminuye las visas
     */
    public void decrementaVidas()
    {
        Nivel1 mundo= (Nivel1)getWorld();
        VIDAS--;
        mundo.cambiaVidas(VIDAS);
        
    }
    
    /**
     * Aumenta vidas
     */
    public void aumentaVidas()
    {
        Nivel1 mundo= (Nivel1)getWorld();
        VIDAS++;
        mundo.cambiaVidas(VIDAS);
        
    }
    
    /**
     * Incrementa tus puntos
     */
    public void aumentaScore()
    {
        Nivel1 mundo= (Nivel1)getWorld();
        SCORE+=1000;
        mundo.cambiaScore(SCORE);
        
        
    }
    
    /**
     * REGRESA EL NUMERO DE VIDAS
     */
       public int getVidas()
    {
        return VIDAS;
    }
    
    /**
     * REGRESA EL VALOR DE EL SCORE
     */
    public int getScore()
    {
        return SCORE;
    }
    
 
    
    

    
    
    
}
